// ==UserScript==
// @name         xiaohongshu
// @namespace    http://tampermonkey.net/
// @version      2025-01-01
// @description  try to take over the world!
// @author       You
// @match        https://www.xiaohongshu.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=xiaohongshu.com
// @grant        unsafeWindow
// ==/UserScript==

(function () {
    'use strict';
/* 
默认就是DomContentLoaded事件运行脚本，符合要求
*/
/* 
无 @grant 或 @grant none
当你没有指定 @grant 或者明确设置 @grant none 时，油猴脚本会运行在一个较为宽松的安全环境中。在这种模式下：
window 和 unsafeWindow 是相同的：这意味着你可以直接访问页面的所有全局变量和函数，而不需要通过 unsafeWindow 来特别访问它们。这可能会带来安全风险，因为你的脚本和页面代码之间没有任何隔离。
指定了 @grant 并且至少包含了一个油猴 API
脚本将运行在一个严格的沙盒环境中 window 和 unsafeWindow 是不同的
*/
    // 保存原始的 XMLHttpRequest.prototype.open 函数
    const originalOpen = XMLHttpRequest.prototype.open;

    // 重写 XMLHttpRequest.prototype.open 函数
    XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
        // 检查是否为需要监听的特定URL
        const targetSubstrings = ['sns/web/v1/feed', 'web/v2/comment'];
        if (targetSubstrings.some(substring => url.includes(substring))) {
            // 继续使用原始的 open 方法
            originalOpen.apply(this, arguments);

            // 添加 readystatechange 事件监听器
            this.addEventListener('readystatechange', function () {
                // 当请求完成时
                if (this.readyState === 4 && this.status >= 200 && this.status < 300) { // 确保响应成功
                    console.log('Response received:', this.responseText);
                }
            }, false);
        } else {
            // 对于其他URL，直接调用原始的 open 方法，不添加额外逻辑
            originalOpen.apply(this, arguments);
        }
    };


    // 使用原始 fetch 函数
    const originalFetch = unsafeWindow.fetch;

    // 覆盖 fetch 函数
    unsafeWindow.fetch = async function(url, options) {
        // 只拦截包含特定子串的 URL
        const targetSubstrings = ['sns/web/v1/feed', 'web/v2/comment'];
        if (targetSubstrings.some(substring => url.includes(substring))) {
            try {
                // 使用原始 fetch 发起请求并等待响应
                const response = await originalFetch(url, options);

                // 克隆响应以确保可以安全地读取body而不影响后续使用
                const clonedResponse = response.clone();

                // 如果需要，可以在这里修改 response
                // 确保响应成功（状态码200-299）
                if (response.ok) {
                    // 将响应内容转换为文本并打印出来
                    const text = await clonedResponse.text();
                    console.log('Intercepted URL:', url);
                    console.log('Response received:', text);

                    // 返回原始响应对象，不影响正常流程
                    return response;
                } else {
                    // 处理非成功的HTTP响应代码
                    console.error('Failed response from:', url);
                    throw new Error(`HTTP error! status: ${response.status}`);
                }
            } catch (error) {
                // 捕获和处理错误
                console.error('Error during fetch:', error);
                throw error;
            }
        } else {
            // 对于其他URL，直接调用原始的 fetch 函数，不添加额外逻辑
            return originalFetch(url, options);
        }
    };
})();